<?php

namespace App\Http\Controllers\Admin;

use App\Http\Models\Admin;
use App\Http\Models\Auth; // 用户自定义模型 Auth门面内置
use App\Http\Models\Role;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Response;

class UserController extends Controller
{
    public function datatable(Request $request)
    {
        // 为datatable插件提供数据，但是需要注意的是，返回数据的格式是有严格要求。返回的数据必须是一个数组，然后里面存在四个key
            /*   "draw": 2, 代表datatable请求的次数，我们原样返回即可 "recordsTotal": 11, 代表是表中的总记录数据，datatable做分页 "recordsFiltered": 11, 代表是做查询后的满足条件总记录 "data":代表要返回的数据
            */
        $count = Admin::count();
        // 根据页码和每页显示的数量来做数据获取 limit offset,number
        $page = $request->get('page');
        $size = $request->get('pageSize');
        $offset = ($page - 1) * $size;
        // 排序 1. 排序字段 2. 升序降序
        $orderIndex = $request->get('order')[0]['column']; // order[0][column]:2
        // 定义一个排序的字段
        $orderData = ['id', 'id', 'username', 'phoneNumber', 'email', '', 'created_at', 'loginIp', 'loginTime', 'is_status']; // 字段写了部分
        $orderBy = $request->get('order')[0]['dir'];
        // 根据关键字做搜索
        $userKeyWord = $request->get('keyWord'); // 用户的搜索框
        $query = Admin::query(); // 返回值是一个 查询构造器，专门做条件拼接处理
        if($userKeyWord){
            // 如果存在则增加搜索条件 可以利用laravel提供的一个查询构造器来进行条件的拼接
            $query->where('username', 'like', '%' . $userKeyWord . '%');
        }
        // 根据查询的时间做范围搜索
        $startAt = $request->get('datemin'); // 2012-12-12
        if($startAt){
            $query->where('created_at', '>=', $startAt . ' 0:0:0');
        }
        $endAt = $request->get('datemax');
        if($endAt){
            $query->where('created_at', '<=', $endAt . ' 23:59:59');
        }

       /* $keyWord = $request->get('search')['value']; // datatable自带的搜索
        if($keyWord){
            // 如果存在则增加搜索条件 可以利用laravel提供的一个查询构造器来进行条件的拼接
            $query->where('username', 'like', '%' . $keyWord . '%');
        }*/
        // 获取搜索后的总记录
        $recordsFilteredCount = $query->count();

        $data = $query->offset($offset)->limit($size)->orderBy( $orderData[ $orderIndex ], $orderBy )->get();

        $returnData = [
            'draw' => $request->get('draw'),
            'recordsTotal' => $count,
            'recordsFiltered' => $recordsFilteredCount,
            'data' => $data
        ];
        return $returnData;
    }

    public function dlst()
    {
        return view('admin.user.dlst');
    }

    public function lst(Request $request)
    {
//        $userData = Admin::all(); // 方式一：获取全部 方式二：分页显示  方式三：简单分页：只有上一页和下一页  方式四：带分页条件（获取没有被锁定的用户 + 排序）
        $size = 10;
//        $userData = Admin::paginate($size); // 参数就是每页的显示数 特点：1. 调用该方法之后，会将数据和分页保存到一个对象里面
//        $userData = Admin::simplePaginate($size);
        // 需求：获取用户的角色的信息 通过关联模型 ：定义用户和角色之间的关系
        // ->with('roles') 这个方法获取关联模型里面的数据信息，会在数据的身上增加一个roles属性，属性里面保存角色的信息
        $userData = Admin::orderBy('id', 'asc')->with('roles')->paginate($size);

        return view('admin.user.lst', compact('userData'));
    }

    public function del(Request $request)
    {
        // 获取要删除的id
        $id = $request->get('id');
        $status = Admin::destroy($id);
        if ($status !== false) {
            // 删除的消息进行返回
            return Response::json([
                'status' => 'success',
                'code' => 1000,
                'msg' => '删除成功！'
            ]);
        } else {
            return Response::json([
                'status' => 'failure',
                'code' => 1002,
                'msg' => '删除失败！'
            ]);
        }

    }

    // 注意：如果我们需要使用 Request类的实例对象，则需要作为第一个参数传递
    public function edt(Request $request, $id)
    {
        if ($request->isMethod('post')) {
            $updateData = $request->except(['_token', 'roles']);
            if ($updateData['password']) {
                $updateData['password'] = bcrypt($updateData['password']);
            } else {
                unset($updateData['password']);
            }

            $status = Admin::where('id', '=', $id)->update($updateData);
            if ($status !== false) {
                // 最新的 角色信息更新
                $roleId = $request->get('roles');
                Admin::find($id)->roles()->sync($roleId);

                return Response::json([
                    'status' => 'success',
                    'code' => 1000,
                    'msg' => '删除成功！'
                ]);
            } else {
                return Response::json([
                    'status' => 'failure',
                    'code' => 1002,
                    'msg' => '删除失败！'
                ]);
            }
        }
        $adminInfo = Admin::find($id);
        $roles = Role::all();
        return view('admin.user.edt', compact('adminInfo', 'roles'));
    }

    public function add(Request $request)
    {
        if ($request->isMethod('POST')) {
            // 后端验证 注意：ajax提交 有错误可以直接的视图通过 $errors展示
            $this->validate($request, [
                'username' => 'required|min:2|max:10',
                'password' => 'required|min:2|max:10',
                'email' => 'required|email',
            ]); // 方式三种
            $data = $request->except(['_token', 'roles']);
            $data['password'] = bcrypt($data['password']); // 密码加密

            $status = Admin::create($data); // 成功返回的是一个模型对象
            // roles 字段应该入到中间表里面 不是到 sh_admin表
            if ($status) {
                // 现在更新 sh_admin_role表里面的关系
                $rolesId = $request->get('roles');// 为用户分配的角色信息，数组
                $status->roles()->sync($rolesId);// sync 会自动的更新

                return Response::json([
                    'status' => 'success',
                    'code' => 1000,
                    'msg' => '添加成功！'
                ]);
            } else {
                return Response::json([
                    'status' => 'failure',
                    'code' => 1002,
                    'msg' => '添加失败！'
                ]);
            }
        }
        // 获取所有的 角色信息
        $roles = Role::all();
        return view('admin.user.add', compact('roles'));
    }

    public function isLocked(Request $request)
    {
        // 用户的锁定处理
        $adminInfo = Admin::find($request->get('id'));
        $adminInfo->is_status = $adminInfo->is_status == 1 ? 0 : 1;
        $status = $adminInfo->save();
        if ($status !== false) {
            return Response::json([
                'status' => 'success',
                'code' => 1000,
                'msg' => '处理成功！'
            ]);
        } else {
            return Response::json([
                'status' => 'failure',
                'code' => 1002,
                'msg' => '处理失败！'
            ]);
        }
    }

}
